package com.lms.service.weixin;

import com.lms.dao.BaseDao;
import com.lms.dao.weixin.WeixinDao;
import com.lms.dao.weixin.WeixinDaoImpl;
import com.lms.util.WeixinUtil.*;
import com.lms.util.WeixinUtil.msg.WeixinPushMsg;
import com.lms.util.WeixinUtil.msg.WeixinPushMsgImpl;
import com.lms.util.WeixinUtil.pojo.WeixinBaseMessage;
import com.lms.util.WeixinUtil.WeixinConstants;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;

import static com.lms.util.WeixinUtil.WeixinUtil.SHA1;
import static com.lms.util.WeixinUtil.WeixinUtil.sort;

public class WeixinSeriveImpl implements WeixinSerive{
    private WeixinDao weixinDao = new WeixinDaoImpl();
    private WeixinPushMsg weixinPushMsg = new WeixinPushMsgImpl();
    private Connection connection;
    @Override
    public String check(HttpServletRequest req) {
        //签名
        String signature = req.getParameter("signature");
        // 时间戳
        String timestamp = req.getParameter("timestamp");
        // 随机数
        String nonce = req.getParameter("nonce");
        // 随机字符串
        String echostr = req.getParameter("echostr");
        //排序
        String sortString = sort(WeixinConstants.TOKEN, timestamp, nonce);
        //加密
        String mytoken = SHA1(sortString);
        // 通过检验signature对请求进行校验，若校验成功则原样返回echostr，表示接入成功，否则接入失败
        if (mytoken != null && mytoken != "" && mytoken.equals(signature)){
            System.out.println("3.微信服务验证成功！"+echostr);
        }else {
            System.out.println("3.微信服务验证失败！"+echostr);
        }
        return echostr;
    }

    @Override
    public String handle(InputStream in) {
        /*事件推送处理流程：
        * 1.微信发来一段XML，通过XML数据包的Event节点获取事件类型
        * 2.根据不同的事件，采取不同的处理方法*/
        String res=null;//最终的处理结果
        Map<String, String> params = null;//存储解析的微信XML

        /*解析XML*/
        try {
            params = XmlUtil.parseStreamToMap(in);
        } catch (Exception e) {
            e.printStackTrace();
        }

        /*不同事件，不同处理*/
        if (params!=null && params.size()>0){
            String event = params.get("Event");//事件标识码
            String openID = params.get("FromUserName");//用户独立标识openID

            if (WeixinConstants.EVENT_TYPE_SUBSCRIBE.equals(event)){
                /*用户关注推送事件
                * 1.绑定openID
                * 2.发送绑定成功消息*/
                String userCode = params.get("EventKey").replaceAll("qrscene_","");
                connection=BaseDao.getConnection();

                try {
                    if (weixinDao.searchOpenID(connection,userCode)){
                        /*用户已经绑定过了*/
                        res="用户已经绑定过了";
                    }else {
                        /*用户还未绑定*/
                        if (weixinDao.bindOpenID(connection,userCode,openID)){
                            /*绑定成功*/
                            res="绑定成功";
                            /*开始发送绑定成功消息*/
                            int msg = weixinPushMsg.push_bindMsg(openID, userCode, WeixinConstants.BIND_TEMPLATE_ID);//推送绑定成功信息
                            if (msg == WeixinConstants.SUCCESS){
                                System.out.println("绑定消息推送状态：绑定消息推送成功");
                                /*以下判断不会触发，因为还未进行用户收信状态的XML数据包的接收*/
                            }else if (msg==WeixinConstants.FAIL_USER_REFUSE){
                                System.out.println("绑定消息推送状态：由于用户拒收，导致绑定消息推送失败");
                            }else {
                                System.out.println("绑定消息推送状态：绑定消息推送失败");
                            }
                        }else {
                            /*绑定失败*/
                            res="绑定失败";
                        }
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally {
                    BaseDao.closeResource(connection,null,null);
                }
            }if (WeixinConstants.EVENT_TYPE_UNSUBSCRIBE.equals(params.get("Event"))){
                /*用户解绑推送事件
                 * 1.解绑openID*/
                connection=BaseDao.getConnection();
                try{
                    if (weixinDao.unbindOpenID(connection,openID)){
                        /*解绑成功*/
                        res="解绑成功";
                    }else {
                        /*解绑失败*/
                        res="解绑失败";
                    }
                }catch (SQLException e){
                    e.printStackTrace();
                }finally {
                    BaseDao.closeResource(connection,null,null);
                }
            }else {
                res="此类事件，尚未有对其处理的程序";
            }
        }else {
            res="事件有误";
        }
        return res;
    }

}
